﻿using Data.Contexto;
using Domain.Entidades;
using Domain.Interfaces.Repositorios;
using Domain.Interfaces.Servicos;
using MoreLinq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;

namespace Data.Repositorios
{
    public class AvisoRepository : RepositoryBase<aviso>, IAvisoRepository
    {
        protected credisiteContext Db = new credisiteContext();
        protected credigeralContext Dbseg = new credigeralContext();

        public IEnumerable<VW_avisos> Listar(DateTime dt1, DateTime dt2, VW_usuarios usuario)
        {
            try
            {
                IEnumerable<VW_avisos> avisos = Dbseg.VW_avisos.Where(x => x.aviso_data <= dt2 && x.aviso_data >= dt1);

                if (usuario != null)
                {
                    avisos = avisos.Where(x => x.aviso_unidade == usuario.uni_codigo || x.aviso_setor == usuario.set_codigo);
                }

                avisos = avisos.DistinctBy(x => x.aviso_codigo).OrderByDescending(x => x.aviso_data).ThenByDescending(x => x.aviso_codigo).ToList();
                return avisos;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Inserir(aviso aviso, int user_codigo)
        {
            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    aviso.aviso_usuario = user_codigo;
                    aviso.aviso_data = DateTime.Now;
                    aviso.aviso_hora = DateTime.Now.ToString("t");

                    if (aviso.tipo == "uni")
                    {
                        List<aviso_unidade> lista = new List<aviso_unidade>();
                        foreach (string unidade in aviso.tipos)
                        {
                            aviso_unidade av_unidade = new aviso_unidade();
                            av_unidade.aviso_unidade1 = int.Parse(unidade);

                            lista.Add(av_unidade);
                        }
                        aviso.aviso_unidade = lista;
                    }
                    else
                    {
                        List<aviso_setor> lista = new List<aviso_setor>();
                        foreach (string setor in aviso.tipos)
                        {
                            aviso_setor av_setor = new aviso_setor();
                            av_setor.aviso_setor1 = int.Parse(setor);
                            lista.Add(av_setor);
                        }
                        aviso.aviso_setor = lista;
                    }

                    Dbseg.aviso.Add(aviso);
                    Dbseg.SaveChanges();

                    log logs = new log();
                    logs.log_modulo = 3;
                    logs.log_tipo = 1018;
                    logs.log_descricao = "Aviso codigo: " + aviso.aviso_codigo;
                    logs.log_usuario = user_codigo;
                    logs.log_data = DateTime.Now;
                    logs.log_horario = DateTime.Now.ToString("T");

                    Dbseg.log.Add(logs);
                    Dbseg.SaveChanges();
                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public VW_avisos carrega_aviso(int codigo)
        {
            try
            {
                VW_avisos aviso = Dbseg.VW_avisos.FirstOrDefault(x => x.aviso_codigo == codigo);
                if (aviso == null)
                {
                    aviso = new VW_avisos();
                    aviso.aviso_descricao = "<p><h2>O aviso selecionado não foi encontrado</h2></p>";
                }

                return aviso;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void deletar(aviso aviso, int user_codigo)

        {
            try
            {
                using (TransactionScope scope = new TransactionScope())
                {


                    Dbseg.aviso_setor.RemoveRange(Dbseg.aviso_setor.Where(x => x.aviso_codigo == aviso.aviso_codigo));
                    Dbseg.aviso_unidade.RemoveRange(Dbseg.aviso_unidade.Where(x => x.aviso_codigo == aviso.aviso_codigo));


                    Dbseg.aviso.Remove(aviso);
                    Dbseg.SaveChanges();

                    log logs = new log();
                    logs.log_modulo = 3;
                    logs.log_tipo = 1019;
                    logs.log_descricao = "Aviso codigo: " + aviso.aviso_codigo;
                    logs.log_usuario = user_codigo;
                    logs.log_data = DateTime.Now;
                    logs.log_horario = DateTime.Now.ToString("T");
                    Dbseg.log.Add(logs);
                    Dbseg.SaveChanges();

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public aviso GetId(int codigo)
        {
            try
            {
                return Dbseg.aviso.FirstOrDefault(x => x.aviso_codigo == codigo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



    }
}